home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Applications 1996 May / SGI IRIX 6.2 Applications 1996 May.iso / dist / impr_dev.idb / usr / include / stiff.h.z / stiff.h
C/C++ Source or Header  |  1996-05-06  |  13KB  |  385 lines

  1. /**************************************************************************
  2.  *
  3.  *           Copyright (c)    1992 Silicon Graphics, Inc.
  4.  *            All Rights Reserved
  5.  *
  6.  *       THIS    IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  7.  *
  8.  * The copyright notice above does not evidence any actual of intended
  9.  * publication of such source code, and is an unpublished work by Silicon
  10.  * Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  11.  * the property of Silicon Graphics, Inc. Any use, duplication or
  12.  * disclosure not specifically authorized by Silicon Graphics is strictly
  13.  * prohibited.
  14.  *
  15.  * RESTRICTED RIGHTS LEGEND:
  16.  *
  17.  * Use, duplication or disclosure by the Government is subject to
  18.  * restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  19.  * Technical Data and Computer Software clause at DFARS 52.227-7013,
  20.  * and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  21.  * Supplement. Unpublished - rights reserved under the Copyright Laws of
  22.  * the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  23.  * Shoreline Blvd., Mountain View, CA 94039-7311
  24.  **************************************************************************
  25.  *
  26.  * File: stiff.h
  27.  *
  28.  * Description:
  29.  *
  30.  * Stream TIFF API dealing with TIFF files which are streams (ie, the
  31.  * can be accessed without seeking.
  32.  *
  33.  * The criteria which a stream TIFF file must meet (in addition to
  34.  * being a valide TIFF file):
  35.  *
  36.  * 1. The images in a stiff file must be in page number order
  37.  *
  38.  * 2. Any data which does not fit in the value section of a tag must
  39.  *    be located immediately after the IFD, must occur in the same
  40.  *    order in which the tags are encountered.  The exception to this
  41.  *    rule is the image data itself, which must come last for each
  42.  *    image.
  43.  *
  44.  * 3. Image data must immediately follow the IFD and any offset values
  45.  *    associated with it.
  46.  *
  47.  * 4. A terminating IFD will always be added to the STIFF file. This
  48.  *    IFD guarantees that an IFD with 0000 in its 'next IFD' field
  49.  *    will appear in the IFD chain. Note that this IFD will not be
  50.  *    encountered when following IFD pointers if the last 'real' IFD
  51.  *    is written with the 'last' parameter set to 1 in STWriteImageHeader.
  52.  *
  53.  * Graphically, a STIFF file looks like this:
  54.  *
  55.  *    +------------------------------+
  56.  *    | TIFF header (8 bytes)        |
  57.  *    +------------------------------+
  58.  *    | optional intervening space   |
  59.  *    +------------------------------+
  60.  *    | IFD for page 1               |
  61.  *    +------------------------------+
  62.  *    | Data for long values in IFD1 |
  63.  *    +------------------------------+
  64.  *    | Image data for page 1        |
  65.  *    +------------------------------+
  66.  *    | optional intervening space   |
  67.  *    +------------------------------+
  68.  *    | IFD for page 2               |
  69.  *    +------------------------------+
  70.  *    | Data for long values in IFD2 |
  71.  *    +------------------------------+
  72.  *    | Image data for page 2        |
  73.  *    +------------------------------+
  74.  *    |            ....              |
  75.  *    +------------------------------+
  76.  *    | Terminating emtpy IFD        |
  77.  *    +------------------------------+
  78.  *
  79.  * With these restrictions in mind, this implementation supports
  80.  * motorola byte ordering class B, G, and R TIFF data, as well as
  81.  * some new classes:
  82.  *
  83.  * Class CMY:
  84.  * ----------
  85.  *    Class CMY stiff data is in Cyan, Magenta, Yellow format.  A new
  86.  *    value for the PhotometricInterpret tag (5), is used to
  87.  *    differentiate this from RGB data.  BitsPerSample values of 1,1,1,
  88.  *    4,4,4 and 8,8,8 are supported.
  89.  *
  90.  *    Tag                         Possible values
  91.  *    -----------------------------------------------------
  92.  *    BitsPerSample               (1,1,1), (4,4,4), (8,8,8)
  93.  *    PhotoMetricInterpret        5
  94.  *    SamplesPerPixel             3
  95.  *    PlanarConfiguration         1,2
  96.  *
  97.  *    For BitsPerSample values of (1,1,1) and PlanarConfiguration value
  98.  *    of 1, pixels are stored 2 to a byte, with the bits in the byte
  99.  *    from most to least significant as follows: CMY0CMY0.  Rows are
  100.  *    padded to contain an integral number of bytes.
  101.  *     
  102.  * This implementation also supports Class R data with BitsPerSample
  103.  * values of (1,1,1), with data layed out similarly.
  104.  *
  105.  * Class CMYK:
  106.  * -----------
  107.  *    Class CMYK stiff data is in Cyan, Magenta, Yellow, Black format.
  108.  *    The value of the PhotoMetricInterp tag for such data is 5.
  109.  *    BitsPerSample values of 1,1,1,1, 4,4,4,4 and 8,8,8,8 are supported.
  110.  *
  111.  *    Tag                         Possible values
  112.  *    -----------------------------------------------------
  113.  *    BitsPerSample               (1,1,1,1), (4,4,4,4), (8,8,8,8)
  114.  *    PhotoMetricInterpret        5
  115.  *    SamplesPerPixel             4
  116.  *    PlanarConfiguration         1,2
  117.  *
  118.  *    For BitsPerSample values of (1,1,1,1) and PlanarConfiguration
  119.  *    value of 1, pixels are stored 2 to a byte, with the bits in the
  120.  *    byte from most significant to least significant as follows:
  121.  *    CMYKCMYK.  Rows are padded to contain an integral number of
  122.  *    bytes.
  123.  * 
  124.  * This API insulates the user from having to actually deal with tags;
  125.  * data structures are passed to functions such as STWriteImageHeader()
  126.  * which convert the provided information into tag format and write it
  127.  * to the stream.
  128.  *
  129.  * Full access to tags is provided, however, via the STAddTag() and
  130.  * STRemoveTag() functions.  It should be possible to write a STIFF
  131.  * file without having to know anything about TIFF itself, unless
  132.  * these functions are used.
  133.  *
  134.  **************************************************************************/
  135.  
  136.  
  137. #ident "$Revision: 1.25 $"
  138.  
  139.  
  140. #ifndef _ST_STIFF_H
  141. #define _ST_STIFF_H
  142.  
  143.  
  144. /*
  145.  * Stream TIFF tags (TIFF tags + SGI specific tags)
  146.  */
  147.  
  148. /* --- BEGIN TAGS --- Do not alter or move this line */
  149. #define STNewSubfileType        0xfe
  150. #define STSubfileType            0xff
  151. #define STImageWidth            0x100
  152. #define STImageLength            0x101
  153. #define STBitsPerSample            0x102
  154. #define STCompression            0x103
  155. #define STPhotometricInterpretation    0x106
  156. #define STThresholding            0x107
  157. #define STCellWidth            0x108
  158. #define STCellLength            0x109
  159. #define STFillOrder            0x10a
  160. #define STDocumentName            0x10d
  161. #define STImageDescription        0x10e
  162. #define STMake                0x10f
  163. #define STModel                0x110
  164. #define STStripOffsets            0x111
  165. #define STOrientation            0x112
  166. #define STSamplesPerPixel        0x115
  167. #define STRowsPerStrip            0x116
  168. #define STStripByteCounts        0x117
  169. #define STMinSampleValue        0x118
  170. #define STMaxSampleValue        0x119
  171. #define STXResolution            0x11a
  172. #define STYResolution            0x11b
  173. #define STPlanarConfiguration        0x11c
  174. #define STPageName            0x11d
  175. #define STXPosition            0x11e
  176. #define STYPosition            0x11f
  177. #define STFreeOffsets            0x120
  178. #define STFreeByteCounts        0x121
  179. #define STGrayResponseUnit        0x122
  180. #define STGrayResponseCurve        0x123
  181. #define STGroup3Options            0x124
  182. #define STGroup4Options            0x125
  183. #define STResolutionUnit        0x128
  184. #define STPageNumber            0x129
  185. #define STColorResponseCurves        0x12d
  186. #define STSoftware            0x131
  187. #define STDateTime            0x132
  188. #define STArtist            0x13b
  189. #define STHostComputer            0x13c
  190. #define STPredictor            0x13d
  191. #define STWhitePoint            0x13e
  192. #define STPrimaryChromaticities        0x13f
  193. #define STColorMap            0x140
  194. #define STHalftoneHints            0x141
  195. #define STTileWidth            0x142
  196. #define STTileLength            0x143
  197. #define STTileOffsets            0x144
  198. #define STTileByteCounts        0x145
  199. #define STInkSet            0x14c
  200. #define STInkNames            0x14d
  201. #define STNumberOfInks            0x14e
  202. #define STDotRange            0x150
  203. #define STTargetPrinter            0x151
  204. #define STExtraSamples            0x152
  205. #define STSampleFormat            0x153
  206. #define STSMinSampleValue        0x154
  207. #define STSMaxSampleValue        0x155
  208. #define STTransferRange            0x156
  209. #define STJPEGProc            0x200
  210. #define STJPEGInterchangeFormat        0x201
  211. #define STJPEGInterchangeFormatLength    0x202
  212. #define STJPEGRestartInterval        0x203
  213. #define STJPEGLosslessPredictors    0x205
  214. #define STJPEGPointTransforms        0x206
  215. #define STJPEGQTables            0x207
  216. #define STJPEGDCTables            0x208
  217. #define STJPEGACTables            0x209
  218. #define STYCbCrCoefficients        0x211
  219. #define STYCbCrSubSampling        0x212
  220. #define STYCbCrPositioning        0x213
  221. #define STReferenceBlackWhite        0x214
  222. #define STSGIPrivate32995        0x80e3    /* In use by Image Library */
  223. #define STSGIPrivate32996        0x80e4    /* In use by Image Library */
  224. #define STSGIPrivate32997        0x80e5    /* In use by Image Library */
  225. #define STSGIPrivate32998        0x80e6    /* In use by Image Library */
  226. #define STSGIPrivate32999        0x80e7    /* In use by Image Library */
  227. #define STCopyright            0x8298
  228. #define STSGIPrinting            0x862f    /* In use by Impressario */
  229. #define STSGIPrivate34352        0x8630
  230. #define STSGIPrivate34353        0x8631
  231. #define STSGIPrivate34354        0x8632
  232. #define STSGIPrivate34355        0x8633
  233. /* --- END TAGS --- Do not alter or move this line */
  234.  
  235.  
  236. /*
  237.  * Error numbers indicating reasons for failure of libstiff functions.  All
  238.  * libstiff functions set STerrno to one of these values when their return
  239.  * values indicate that a failure has occurred.
  240.  */
  241. #define STEBASE 200
  242.  
  243. #define STENOMEM        (STEBASE)
  244. #define STENOTFOUND        (STEBASE + 1)
  245. #define STEBADTAG        (STEBASE + 2)
  246. #define STEBADSTREAM        (STEBASE + 3)
  247. #define STENEEDSEEK        (STEBASE + 4)
  248. #define STEREADFROMWRITE    (STEBASE + 5)
  249. #define STEWRITETOREAD        (STEBASE + 6)
  250. #define STESYSCALL        (STEBASE + 7)
  251. #define STEBADIMAGE        (STEBASE + 8)
  252. #define STEEOF                  (STEBASE + 9)
  253.  
  254. #define STELAST STEEOF
  255.  
  256.  
  257. #define ST_READ   0    /* open for reading */
  258. #define ST_WRITE  1    /* open for writing */
  259. #define ST_COMPAT 2    /* don't do anything that's not in TIFF spec */
  260.                /* (no SGI enhancements; attempts to do things */
  261.                /* requiring SGI enhancements return an error */
  262.  
  263. #define ST_INTEL    0x4949
  264. #define ST_MOTOROLA 0x4d4d
  265. #define ST_MAGIC    42
  266.  
  267. /* Photometric interpretation */
  268.  
  269. typedef unsigned short STType;
  270.  
  271. /*
  272.  * K, W, RGB, CMAP, MASK, and SEP all correspond to the tag values
  273.  * from the TIFF specification for the photometric interpretation tag.
  274.  */
  275. #define ST_TYPE_K    0    /* 1 == black, 0 == white */
  276. #define ST_TYPE_W    1    /* 1 == white, 0 == black */
  277. #define ST_TYPE_RGB    2    /* red, green, blue */
  278. #define ST_TYPE_CMAP    3    /* color map */
  279. #define ST_TYPE_MASK    4    /* transparency mask */
  280. #define ST_TYPE_SEP    5    /* separated: cmyk or cmy */
  281. /*
  282.  * These others are all obtained from IFDs in which the photometric
  283.  * interpretation tag is 5 (separation), and libstiff was able to
  284.  * decipher the ink names.
  285.  */
  286. #define ST_TYPE_YMC    0xff01        /* yellow, magenta, cyan */
  287. #define ST_TYPE_YMCK    0xff02        /* yellow, magenta, cyan, black */
  288. #define ST_TYPE_KCMY    0xff03        /* black, cyan, magenta, yellow */
  289. #define ST_TYPE_CMY     0xff04          /* cyan, magenta, yellow */
  290. #define ST_TYPE_CMYK    0xff05          /* cyan, magenta, yellow, black */
  291.  
  292. /* Planar Configuration */
  293.  
  294. typedef unsigned short STPlane;
  295.  
  296. #define ST_PLANE_PACKED        1    /* Chunky format */
  297. #define ST_PLANE_PLANAR        2    /* Planar format */
  298.  
  299. /* Tag Types */
  300.  
  301. typedef unsigned short STTagType;
  302.  
  303. #define ST_TAG_TYPE_BYTE    1
  304. #define ST_TAG_TYPE_ASCII    2
  305. #define ST_TAG_TYPE_SHORT    3
  306. #define ST_TAG_TYPE_LONG    4
  307. #define ST_TAG_TYPE_RATIONAL    5
  308. #define ST_TAG_TYPE_SBYTE    6
  309. #define ST_TAG_TYPE_UNDEFINED    7
  310. #define ST_TAG_TYPE_SSHORT    8
  311. #define ST_TAG_TYPE_SLONG    9
  312. #define ST_TAG_TYPE_SRATIONAL    10
  313. #define ST_TAG_TYPE_FLOAT    11
  314. #define ST_TAG_TYPE_DOUBLE    12
  315.  
  316. #define ST_LAST_TAG        ST_TAG_TYPE_DOUBLE
  317.  
  318.  
  319. typedef struct tag_sttag {
  320.     unsigned short tag;
  321.     unsigned short type;
  322.     unsigned long len;
  323.     void *val;
  324. } STTag;
  325.  
  326. typedef struct tag_taglist {
  327.     STTag tag;
  328.     struct tag_taglist *next;
  329. } STTagList;
  330.                                    
  331. typedef struct tag_stiff {
  332.     unsigned long offset, next;
  333.     int fd, page, flags;
  334.     STTagList *tags;
  335.     unsigned short byteOrder;
  336.     unsigned int canSeek : 1;
  337. } STStream;
  338.  
  339. typedef struct tag_imghdr {
  340.     unsigned long width, height;
  341.     unsigned short bitsPerSample;
  342.     unsigned short samplesPerPixel;
  343.     unsigned long imgbytes;
  344.     STType type;
  345.     STPlane plane;
  346. } STImageHeader;
  347.  
  348. typedef struct tag_tiffheader {
  349.     unsigned short byteOrder;
  350.     unsigned short magic;
  351.     unsigned long offset;
  352. } STHeader;
  353.  
  354.  
  355. /*
  356.  * set to an STE value upon error
  357.  */
  358. extern int STerrno;
  359.  
  360.  
  361. #ifdef __cplusplus
  362. extern "C" {
  363. #endif
  364. extern int STReadImageHeader(STStream *st, STImageHeader *hd);
  365. extern int STWriteImageHeader(STStream *st, STImageHeader *hd, int last);
  366. extern int STAddTag(STStream *st, unsigned short tag, STTagType type,
  367.             unsigned long len, void *val);
  368. extern int STRemoveTag(STStream *st, unsigned short tag);
  369. extern int STGetTag(STStream *st, unsigned short tag, STTagType *type,
  370.             unsigned long *len, void **val);
  371. extern STStream* STOpen(int fd, int flags);
  372. extern int STClose(STStream *st);
  373. extern int STSkipTo(STStream *st, unsigned long offset);
  374. extern int STRead(STStream *st, void *buf, int nbytes);
  375. extern int STWrite(STStream *st, void *buf, int nbytes);
  376. extern void STPerror(char *pre);
  377. extern char* STErrorString(int err);
  378. extern int STPrintTags(FILE *fp, STStream *st);
  379. #ifdef __cplusplus
  380. }
  381. #endif
  382.  
  383.  
  384. #endif  /* _ST_STIFF_H */
  385.